package com.atguigu.springcloud.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

/**
 * @auther zzyy
 * @create 2020-02-21 16:40
 */
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter,Ordered
{

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
    {
        log.info("***********come in MyLogGateWayFilter:  "+new Date());

        String uname = exchange.getRequest().getQueryParams().getFirst("uname");

        if(uname == null)
        {
            log.info("*******用户名为null，非法用户，o(╥﹏╥)o");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }

        return chain.filter(exchange);
    }

    @Override
    public int getOrder()
    {
        return 0;
    }
}

//    在 Spring Cloud Gateway 中，自定义的全局过滤器（如 MyLogGateWayFilter）是在请求匹配成功后执行的。也就是说，过滤器会在请求成功地匹配到对应的路由后，但在将请求转发到目标微服务之前执行。
//
//        过滤器执行顺序
//        请求到达网关：用户发起的请求首先到达 Spring Cloud Gateway。
//
//        路由匹配：网关会根据配置的路由规则（如路径、请求方法等）匹配请求。
//
//        全局过滤器执行：在路由匹配成功后，网关会执行配置的全局过滤器（例如 MyLogGateWayFilter）。在这个阶段，你可以对请求进行处理，比如记录日志、进行身份验证等。
//
//        转发请求：如果全局过滤器的逻辑允许请求继续（即没有直接返回响应），请求将被转发到目标微服务。
//
//        响应返回：微服务返回响应后，网关可能会再次通过全局过滤器进行处理（如果有配置的后置过滤器）。


//    在 Spring Cloud Gateway 中，getOrder() 方法是用来定义过滤器的执行顺序的。这个方法属于 Ordered 接口，所有实现了该接口的过滤器都可以通过这个方法来指定自身在一系列过滤器中的优先级。
//
//        方法详解
//        返回值：int getOrder() 方法返回一个整数值，该值越小，表示过滤器的优先级越高（即越早执行）。
//
//        返回值为 0 表示这个过滤器在其他未指定订单的过滤器之前执行。
//        返回值为正值则表示较低优先级，可能在后面的一些过滤器之后执行。如果有多个过滤器，Spring 会根据这些订单来排列它们的执行顺序。
//        执行顺序：当有多个过滤器被应用到请求时，Spring Cloud Gateway 会根据每个过滤器的 order 值来确定其执行顺序。例如，如果你有以下三个过滤器：
//
//        FilterA 返回 1
//        FilterB 返回 0
//        FilterC 返回 2
//        在处理请求时，它们的执行顺序将会是：FilterB -> FilterA -> FilterC。